package com.kkb.study;

import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

/*
*   Supplier: 空参数，必须有返回值。 get来获取返回值
*   Consumer：有参数，无返回值。  accept来赋值调用    andThen可以连接调用 从前往后执行
*   Function：有参数，有返回值。  apply来赋值调用     compose可以连续调用 从后往前执行
*   Predicate: 有参数，有返回值（true || false）。 test来赋值调用。
* */
public class Test {
    public static void main(String[] args) {
        test8();
    }

    public static void test1(){
        Supplier<String> supplier = () -> {
            return "caonima";
        };
        System.out.println(supplier.get());
    }

    public static void test2(){
        Supplier<Student> supplier = () -> {
            return new Student("jack", 32);
        };
        System.out.println(supplier.get().toString());
    }

    public static void test3(){
        Consumer<Integer> consumer = (Integer x) -> {
            System.out.println(Math.pow(x,2));
        };
        consumer.accept(4);
    }

    public static void test4(){
        Consumer<String> consumer1 = (String str) -> {
            System.out.print(str + ":");
        };

        Consumer<String> consumer2 = (String str) -> {
            System.out.print(str);
        };
        consumer1.andThen(consumer2).accept("赵云");
    }

    public static void test5(){
        Function<Integer[],String> func = (Integer[] arr) -> {
            return "数组的乘积为：" + arr[0] * arr[1];
        };
        System.out.println(func.apply(new Integer[]{10, 20}));
    }

    public static void test6(){
        Function<Integer, Integer> func1 = (Integer num) -> {
            return  num + 5;
        };
        Function<Integer, Integer> func2 = (Integer num) -> {
            return  num + 10;
        };
        System.out.println(func1.compose(func2).apply(80));  //95
        System.out.println(func1.andThen(func2).apply(80));
    }

    public static void test7(){
        Predicate<Integer> predicate = (Integer n) ->{
            return n > 5;
        };
        System.out.println(predicate.test(10));
    }

    public static void test8(){
        Integer result = new TestInterface() {
            @Override
            public Integer add(int a, int b) {
                return a + b;
            }
        }.add(3, 5);

        System.out.println(result);

    }
}
